<?php
	namespace bank;

	/**
	 * 用来计算这样的分配是否为安全的分配(不会造成死锁)
	 * @param array $available 当前系统中可用的资源 m
	 * @param array $max 所有程序所需要的各种资源总数 n*m
	 * @param array $allocation 已经分配的资源数 n*m 
	 * @param array $need 还需要的资源数 n*m 
	 * @param array $requist 请求分配的进程与资源数 array('n'=>0,'m'=>1,'r'=>1);
	 * @return bool 是否分配完成后能成为安全的序列
	 */
	function isSave($available, $max, $allocation, $need, $request){
		if($request['r'] > $need[$request['n']][$request['m']] || $request['r'] > $available[$request['m']])
			return false;
		$available[$request['m']] -= $request['r'];
		$allocation[$request['n']][$request['m']] += $request['r'];
		$need[$request['n']][$request['m']] -= $request['r'];
		return _isSave($available, $allocation,$need,$request['m']);

	}


	function _isSave($available,$allocation,$need,$j){
		$n = count($allocation);
		$finish = array();
		for($i = 0; $i < $n; $i++)
			$finish[$i] = false;
		for($i = 0; $i < $n; $i++){
			if($finish[$i] == false && $need[$i][$j] <= $available[$j]){
				$available[$j] += $allocation[$i][$j];
				$finish[$i] = true;
				$i = -1;
			}
		}
		for($i = 0; $i < $n; $i++)
			if($finish[$i] == false) return false;
		return true;
	}
	

	$available = array(3);
	$max = array(9,8,4);
	$allocation = array(array(6),array(1),array(0));
	$need = array(array(3),array(7),array(4));
	$request = array('n'=>2, 'm'=>0, 'r' => 3);
	$r = isSave($available, $max, $allocation, $need, $request);
	var_dump($r);
